//
//  KChatMessageHelper.m
//  KXiniuCloud
//
//  Created by eims on 2018/5/4.
//  Copyright © 2018年 EIMS. All rights reserved.
//

#import "KChatMessageHelper.h"

#import "KEmojiGroup.h"
#import "KEmojiModel.h"
#import "NSTextAttachment+Emoji.h"

@implementation KChatMessageHelper

+ (NSAttributedString *)formatMessageString:(NSString *)text {
    if (!text) {
        return [[NSAttributedString alloc] initWithString:@""];
    }
    //1、创建一个可变的属性字符串
    NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:text];
    NSMutableParagraphStyle   *paragraphoStyle = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy];
    paragraphoStyle.lineSpacing = LINESPACE;
    [attributeString addAttribute:NSParagraphStyleAttributeName value:paragraphoStyle range:NSMakeRange(0, attributeString.length)];
    [attributeString addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:INPUT_BOX_TEXT_FONT] range:NSMakeRange(0, attributeString.length)];
    [attributeString addAttribute:NSForegroundColorAttributeName value:INPUT_BOX_TEXTCOLOR range:NSMakeRange(0, attributeString.length)];
    //2、通过正则表达式来匹配字符串 \[[a-zA-Z0-9\/\u4e00-\u9fa5]+\]
    NSString *regex_emoji = @"\\[[a-zA-Z0-9\\/\\u4e00-\\u9fa5]+\\]|\\/[a-zA-Z0-9\\/\\u4e00-\\u9fa5]{1,5}"; //匹配表情
    
    NSError *error = nil;
    NSRegularExpression *re = [NSRegularExpression regularExpressionWithPattern:regex_emoji options:NSRegularExpressionCaseInsensitive error:&error];
    if (!re) {
        NSLog(@"error:%@", [error localizedDescription]);
        return attributeString;
    }
    
    NSArray *resultArray = [re matchesInString:text options:0 range:NSMakeRange(0, text.length)];
    if (resultArray.count == 0) {
        return attributeString;
    }
    
    //3、获取所有的表情以及位置
    //用来存放字典，字典中存储的是图片和图片对应的位置
    NSMutableArray *imageArray = [NSMutableArray arrayWithCapacity:resultArray.count];
    //根据匹配范围来用图片进行相应的替换
    for(NSTextCheckingResult *match in resultArray) {
        //获取数组元素中得到range
        NSRange range    = [match range];
        //获取原字符串中对应的值
        NSString *subStr = [text substringWithRange:range];
        
        if ([[subStr substringToIndex:1] isEqualToString:@"/"]) {
            subStr = [NSString stringWithFormat:@"[%@]",[subStr substringFromIndex:1]];
        }
        
        KEmojiGroupManager *emojiManager = [KEmojiGroupManager shareManager];
        NSArray *emojiArray = emojiManager.currentEmojiList;
        [emojiArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            
            KEmojiModel *emojiModel = (KEmojiModel *)obj;
//            NSLog(@"遍历表情: %lu -> %@", (unsigned long)idx, emojiModel.emojiName);
            
            if ([emojiModel.emojiName isEqualToString:subStr]) {
                //face[i][@"png"]就是我们要加载的图片
                //新建文字附件来存放我们的图片,iOS7才新加的对象
                NSTextAttachment *textAttachment = [[NSTextAttachment alloc] init];
                //给附件添加图片
                textAttachment.image          = [UIImage imageNamed:emojiModel.name];
                textAttachment.emojiName      = emojiModel.emojiName;
                //调整一下图片的位置,如果你的图片偏上或者偏下，调整一下bounds的y值即可
                textAttachment.bounds         = CGRectMake(0, -5, 20, 20);
                //把附件转换成可变字符串，用于替换掉源字符串中的表情文字
                NSAttributedString *imageStr  = [NSAttributedString attributedStringWithAttachment:textAttachment];
                //把图片和图片对应的位置存入字典中
                NSMutableDictionary *imageDic = [NSMutableDictionary dictionaryWithCapacity:2];
                [imageDic setObject:imageStr forKey:@"image"];
                [imageDic setObject:[NSValue valueWithRange:range] forKey:@"range"];
                //把字典存入数组中
                [imageArray addObject:imageDic];
                
            }
        }];
    }
    
    //4、从后往前替换，否则会引起位置问题
    for (int i = (int)imageArray.count -1; i >= 0; i--) {
        NSRange range;
        [imageArray[i][@"range"] getValue:&range];
        //进行替换
        [attributeString replaceCharactersInRange:range withAttributedString:imageArray[i][@"image"]];
    }
    
    return attributeString;
}

/**
 在消息页面显示的富文本

 @param att 输入框得到的富文本
 @return 处理好的可以显示在页面上的富文本
 */
+ (NSAttributedString *)formatMessageAtt:(NSAttributedString *)att
{
    __block NSMutableAttributedString *attributedStr = [[NSMutableAttributedString alloc] initWithAttributedString:att];
    [attributedStr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:INPUT_BOX_TEXT_FONT] range:NSMakeRange(0, attributedStr.length)];
    [attributedStr addAttribute:NSForegroundColorAttributeName value:INPUT_BOX_TEXTCOLOR range:NSMakeRange(0, attributedStr.length)];
    [att enumerateAttribute:NSAttachmentAttributeName inRange:NSMakeRange(0, att.length) options:NSAttributedStringEnumerationReverse usingBlock:^(NSTextAttachment *value, NSRange range, BOOL * _Nonnull stop) {
        if (value) {
            value.bounds = CGRectMake(0, -5, 25, 25);
            NSAttributedString *imageStr = [NSAttributedString attributedStringWithAttachment:value];
            
            [attributedStr replaceCharactersInRange:range withAttributedString:imageStr];
        } 
    }];
    return attributedStr;
}

@end
